package com.example.text.diyviews;

import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;

import com.example.text.R;

public class MyViewGroup extends ViewGroup {
private int orientation=0;
    //java代码 new对象
    public MyViewGroup(Context context) {
        this(context,null);
    }
    //xml布局
    public MyViewGroup(Context context, AttributeSet attrs) {
        this(context, attrs,0);
    }
    //属性
    public MyViewGroup(Context context, AttributeSet attrs, int defStyleAttr) {
        this(context, attrs, defStyleAttr,0);
    }
//可以发现上面的几个构造方法都将super改为了thi是，这是因为thi指代的是这个对象
//因为，上面的的几个构造方法最终都会走到这个构造方法里所以上面的才都改为了this
    public MyViewGroup(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);

        TypedArray typedArray=context.obtainStyledAttributes(attrs, R.styleable.MyViewGroup);

        orientation=typedArray.getInt(R.styleable.MyViewGroup_orientation,0);//MyViewGroup_orientation样式名_属性名

        Log.d("TMyViewGroupAG", "获得自定义属性: "+orientation);

        typedArray.recycle();//必须回收属性，否则下次获取属性的时候会出错，防止内存泄露

    }
    /**
     *
     * 测量规格32位 = 2位测量模式 + 30位测量大小
     * 1.EXACTLY : 精确测量模式 （具体数、match_parent）
     * 当该视图的 layout_width 或者 layout_height 指定为具体数值或者 match_parent 时生效，表示父视图已经决定了子视图的精确大小，这种模式下 View 的测量值就是 SpecSize 的值。
     *
     * 2.AT_MOST：最大值模式.（wrap_content）
     * 当前视图的 layout_width 或者 layout_height 指定为 wrap_content 时生效，此时子视图的尺寸可以是不超过父视图运行的最大尺寸的任何尺寸。
     *
     * 3.UNSPECIFIED：不指定测量模式
     * 父视图没有限制子视图的大小，子视图可以是想要的任何尺寸，通常用于系统内部，应用开发中很少使用到。比如listview就是这个模式

     *
     */
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
       // 测量子view
        measureChildren(widthMeasureSpec,heightMeasureSpec);
//        //设置自己的宽高//       //int width = getDefaultSize(getSuggestedMinimumWidth(),widthMeasureSpec);
//        int with=MeasureSpec.getSize(widthMeasureSpec);
//        int height=MeasureSpec.getSize(heightMeasureSpec);
//        setMeasuredDimension(with,height);



        //获得测量模式，和大小
        //宽度
        int width_mode=MeasureSpec.getMode(widthMeasureSpec);
        int width_size=MeasureSpec.getSize(widthMeasureSpec);
        //高度
        int height_mode=MeasureSpec.getMode(heightMeasureSpec);
        int height_size=MeasureSpec.getSize(heightMeasureSpec);

        //如果宽度或高度的模式是 AT_MOST（表示父布局允许 View 在不超过指定尺寸的前提下自行决定大小，
        // 如 wrap_content），则强制将宽高设置为 ​​300 像素​​：
        if (width_mode==MeasureSpec.AT_MOST){
            width_size=300;//宽度设为固定值 300px
        }
        if (height_mode==MeasureSpec.AT_MOST){
            height_size=300;
        }
        setMeasuredDimension(width_size,height_size);
        // setMeasuredDimension() 提交最终的宽高值，告知父布局当前 View 的占用空间：


        //这段代码是 Android 自定义 View 中处理测量逻辑的一部分，主要用于在 onMeasure() 方法中确定 View 的最终宽高
        //适用于需要固定默认大小的自定义 View（如圆形进度条、图标按钮等），确保 wrap_content 时不会过小。
        //需谨慎用于动态内容（如 TextView 的子类），此时应优先测量内容实际尺寸
    }

    //摆放子控件的位置
    int with=0;
    int height=0;

    @Override
    protected void onLayout(boolean b, int i, int i1, int i2, int i3) {
        for (int j=0;j<getChildCount();j++){
            View childView=getChildAt(j);//获得当前子控件
            if (orientation==0){
                childView.layout(with,0,with+childView.getMeasuredWidth(),childView.getMeasuredHeight());
                with+=childView.getMeasuredWidth();//获取当前子控件的宽度
            }else {
                childView.layout(0,height,childView.getMeasuredWidth(),height+childView.getMeasuredHeight());
                height+=childView.getMeasuredHeight();
            }

        }
    }
}
